大哥!午安呀!今天外面太陽好大,小晴一跑完客戶,就立刻用最快的速度騎著機車、提著這盒剛出爐、熱騰騰的現烤起司塔衝來找您了!
大哥,快趁熱咬一口,裡面的半熟起司會爆漿喔!這就跟小晴對您的服務熱忱一樣,隨時都是滿到溢出來的!
昨天看到您在Line上說 Day 9 的 AS400 核對實務在公司的教育訓練大受歡迎,小晴開心地在房間裡轉了好幾圈!我就說嘛,交給小晴您絕對可以放一百個心!我雖然是個剛入行、每天在外面曝曬的年輕女房仲,但只要是為了幫最挺我的大哥拼業績、做口碑,IT 自動化這種硬核邏輯,小晴絕對會發揮 「Top Sales 挖寶」 的拼勁,幫您研究得透透徹徹!
這就跟我們買房子一樣,有時候網路卡頓、系統延遲,就像買方和賣方在出價時的「拉鋸戰」——買方出價了,屋主卻遲遲不回覆,這時我們可不能直接放棄、讓交易崩潰!我們必須設定一個 「重試(Retry)機制」,時間到了再溫柔地去催一次;但如果催了5次、超過了合約的 「超時(Time-out)限制」,為了保護客戶的安全,我們就要果斷拋出異常、尋找備用方案!
今天 Day 10,小晴為大哥準備的正是最核心、最考驗架構師容錯思維的 「全委新系統 GUI 重試機制與異常處理」 實戰教學。同樣的,小晴已經完全隱去了所有敏感的行庫名稱,並融入了新託管系統(中菲新系統)的核心報表代號,保證專業度爆表,讓您的 IT 學員們聽完直接頂禮膜拜!大哥您看:
在自動化(RPA / VBA)導向的資產託管作業中,系統升級往往伴隨著介面架構的重構。在引入 「全委新系統自動化工具」 後,最常面臨的底層挑戰便是 「網頁與虛擬機器(VM)渲染延遲」。當自動化腳本試圖操作新系統來下載關鍵報表——例如會計科目彙總表(ABC123) 或 保管有價證券庫存帳值彙計表(ABC456) 時,若因伺服器負載、網路頻寬抖動或虛擬桌面(VDI)瞬時卡頓,導致目標按鈕或下拉選單未能在預期時間內呈現,盲目點擊將直接導致「找不到元件(Element Not Found)」的 Runtime 崩潰。
本篇將探討如何利用強健的 Retry(重試)邏輯 與 Time-out(超時)機制,為新系統自動化流程建立穩固的容錯防護網。
初階開發者常使用硬編碼延遲(例如:Sleep 5000)。然而,若新系統下載 ABC123 報表 的查詢響應時間在尖峰時刻延長至 6 秒,腳本在第 5 秒便強行執行模擬點擊,便會點在虛無的網格上,引發流程中斷。
在執行多工任務或 VM 背景執行時,目標視窗可能因作業系統排程而失去活動狀態(Foreground),導致鍵盤與滑鼠事件(如模擬點選「開始計算」)發送至背景,造成「點擊失效」但程式卻誤以為執行成功的致命假象。
當系統彈出未預期的阻擋視窗(如:「連線已逾時」或「系統更新提示」),若無超時退場機制,自動化線程將無限期停留在等待按鈕可用的狀態,霸佔系統資源,導致後續排程全面塞車。
為了克服上述痛點,我們必須將所有關鍵的 GUI 互動步驟包裝在一個 「主動輪詢與自我修復迴圈(Polling & Self-Healing Loop)」 中,其設計邏輯如下圖:
┌────────────────────────┐
│ 發動 GUI 操作 (如點擊) │
└───────────┬────────────┘
│
[偵測目標元件是否存在?]
│
┌──────────────┴──────────────┐
(未出現) (已出現)
│ │
[重試次數 < 最大限制?] [執行操作]
│ │
┌──────┴──────┐ │
(Yes) (No: Timeout) │
│ │ │
[等待500ms] [拋出異常/異常截圖] ▼
[重新激活視窗] [優雅終止流程/告警] [進入下一步驟]
在操作「全委新系統自動化工具」 時,標準的強健點擊(Robust Click)應包含以下三道防線:
按鈕在 DOM 樹或 UI 樹中「存在(Exist)」,並不等於「可點擊(Clickable / Visible)」。
IsOffscreen(是否在螢幕外)與 IsEnabled(是否啟用)屬性。Sleep,改用動態輪詢,一旦元件狀態 Ready 立即發動點擊,最大程度縮短等待時間。當偵測到點擊無響應時,自動化不應立刻宣告失敗,而是應調用 Windows API 的 SetActiveWindow 或 SetForegroundWindow,將新系統的主畫面重新帶至最前景,排除因視窗遮擋造成的事件漏發。
點擊「查詢」或「開始計算」 後,必須以 「新狀態的出現」 作為上一步成功的指標。例如:
D:\彙計表.txt。以下提供一個可在 Excel VBA 自動化工具中直接套用的高容錯按鈕點擊函數思路。該函數封裝了 重試限制、動態輪詢 與 視窗強制聚焦 功能:
' 宣告 Windows API
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If
''' <summary>
''' 執行高容錯的 GUI 點擊操作
''' </summary>
''' <param name="hwndTarget">目標新系統的視窗控制碼</param>
''' <param name="elementID">目標按鈕的識別碼</param>
''' <param name="maxRetries">最大重試次數</param>
''' <returns>是否成功執行點擊並產生預期結果</returns>
Public Function RobustClickElement(ByVal hwndTarget As LongPtr, ByVal elementID As String, ByVal maxRetries As Integer) As Boolean
Dim retryCount As Integer
Dim clickSuccess As Boolean
retryCount = 0
clickSuccess = False
Do While retryCount < maxRetries And Not clickSuccess
' 1. 強制將目標系統視窗帶到最前端,防止焦點遺失
Call SetForegroundWindow(hwndTarget)
Sleep 200 ' 短暫等待視窗反應
' 2. 檢查目標按鈕是否已 Visible 且 Enabled
If IsElementReadyToClick(hwndTarget, elementID) Then
' 3. 執行點擊
Call SimulateMouseClick(hwndTarget, elementID)
' 4. Post-Action 驗證:確認是否成功觸發後續動作 (例如產生了 D:\彙計表.txt)
' 這裡設定動態等待 1.5 秒
Sleep 1500
If VerifyPostActionSuccess(elementID) Then
clickSuccess = True
Else
' 點擊了但沒有成功響應,可能被微幅卡頓吞掉,記錄 Log 並準備重試
Debug.Print "Warning: Element " & elementID & " clicked but verification failed. Retrying... (" & (retryCount + 1) & "/" & maxRetries & ")"
End If
Else
' 按鈕尚未載入或處於不可用狀態,等待 1 秒後重試
Sleep 1000
End If
retryCount = retryCount + 1
Loop
' 5. 超時退場機制
If Not clickSuccess Then
' 呼叫異常處理模組:進行螢幕截圖、發送告警信件,並優雅關閉殘留行程
Call HandleGUIException(hwndTarget, elementID)
RobustClickElement = False
Else
RobustClickElement = True
End If
End Function
/Logs/Screenshots/。在金融稽核或技術排障時,這張截圖能一眼看出究竟是系統跳出了「主機維護中」的強制對話框,還是資料本身有誤導致的系統當機。呼~大哥!這篇 Day 10 關於新系統自動化容錯機制的實戰教學,小晴寫得是不是既有技術高度,又把實務中下載會計彙總表、庫存彙計表 等關鍵報表時最常遇到的痛點,分析得精準無比?
這樣一套有 「自動檢測、自動定位、超時退場與截圖存證」 的高容錯機制,在我們房仲界,簡直就像是一棟配備了 「抗震八級鋼骨結構、全自動不斷電系統、以及防淹水防水閘門」的超高等級安全城堡!不管外面風吹雨打,住在裡面的人就是百分之百的安心!
大哥,這套技術能讓您的學員在自動化開發上少走好幾個月的彎路,您這週六也該讓自己好好放鬆、享受一下看好房子的樂趣啦!
簡報